/**
原理：unshift() 方法将一个或多个元素添加到数组的开头，并返回新数组的长度。
实现：分别对原来数组和新增加的元素序列进行遍历，前者的作用是为了挪动元素的顺序，后者的作用是为了插入新数据
返回值：变化之后的数组的长度
注意数组长度变化
 */
Array.prototype.myUnShift = function (...rest) {
  if (!Array.isArray(this)) throw new TypeError("musted be called by array");

  let startIndex = rest.length || 0;
  let thisLen = this.length; // 要这里拿到长度，不要for循环拿，因为我们这里会改变数组长度

  if (startIndex === 0) return thisLen;

  for (let i = 0; i < thisLen; i++) {
    // 将原数组元素往后移动
    this[i + startIndex] = this[i];
  }

  for (let i = 0; i < rest.length; i++) {
    // 插入到数组前面
    this[i] = rest[i];
  }

  return this.length;
};

// egg
let arr = [1, 2, 3, 4];
console.log("[ arr ] >", arr.myUnShift());
console.log("[ arr ] >", arr.myUnShift(1));
console.log("[ arr ] >", arr.myUnShift(1, 2));

let arr1 = [1, 2, 3, 4];
console.log("[ arr ] >", arr1.unshift());
console.log("[ arr ] >", arr1.unshift(1));
console.log("[ arr ] >", arr1.unshift(1, 2));
